import json, os
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Image
from reportlab.lib.units import cm
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
from reportlab.lib import colors
from PIL import Image as PILImage
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Image, PageBreak  # 添加 PageBreak
from reportlab.lib.colors import HexColor  # 新增导入


# 加载字体文件并注册到 ReportLab
def register_fonts(font_path):
    pdfmetrics.registerFont(TTFont('MicrosoftYaHei', font_path))

# 调整图片大小
def resize_image(image_path, target_width_cm):
    img = PILImage.open(image_path)
    aspect_ratio = img.height / img.width
    if img.width > img.height:
        target_height_cm = target_width_cm * aspect_ratio
        target_width = target_width_cm * cm
        target_height = target_width * aspect_ratio
    else:
        target_height_cm = target_width_cm
        target_width_cm = target_height_cm / aspect_ratio
        target_width = target_width_cm * cm
        target_height = target_height_cm * cm
    return Image(image_path, width=target_width, height=target_height)


def create_main_page(json_data):
    # Register font from JSON input
    register_fonts(json_data['font_path'])
    # Resize image and insert into the table
    main_table_data = json_data['main_table_data']
    img_list = [[], []]
    for index, img_path in enumerate(json_data['defects_dom_path']):
        resized_image = resize_image(img_path, json_data['defects_dom_width_cm'])
        img_index = 0
        if (index >= 2):
            img_index = 1
        # img_list[img_index].append(resized_image)  # Insert image at the correct position
        img_list[img_index].append(None)
        img_list[img_index].append(None)
    for img_arr in img_list:
        main_table_data.append(img_arr)
    # Define table styles
    row_heights = [None, 1 *cm, None, 1 *cm, None, 1 *cm, 1 *cm, 1 *cm, 1 *cm,None, 1*cm,1*cm, 1*cm, 1*cm, 1*cm, 1*cm, 1*cm, 1*cm, 1*cm, 1*cm, 1*cm, 1*cm, 1*cm, 1*cm, 1*cm, 1*cm, 1*cm ]
    main_table_element = Table(main_table_data, colWidths=[1*cm, 2*cm, 3*cm, 3*cm, 3*cm, 3*cm, 3*cm], rowHeights=row_heights)
    main_table_element.setStyle(TableStyle([
        ('SPAN', (0, 0), (-1, 0)),  # 合并第一行所有列
               ('SPAN', (0, 2), (-1, 2)),  # 合并第三行所有列
        ('LEADING', (0, 0), (-1, 0), 22), # 设置第一行的行高为22
        ('ALIGN', (0, 0), (-1, 0), 'CENTER'), # 第一行文字居中
        ('FONTSIZE', (0, 0), (-1, 0), 18), # 第一行文字字号18
        ('BACKGROUND', (0, 0), (-1, 0), HexColor('#E1EFD9')), # 第一行为表头 背景色为浅绿

        ('SPAN', (0, 1), (1, 1)),  # 合并第2行1,2列
        ('SPAN', (2, 1), (3, 1)),  # 合并第2行3,4列
        ('SPAN', (5, 1), (6, 1)),  # 合并第2行6,7列

 
        ('LEADING', (0, 2), (-1, 2), 22), # 设置第三行的行高为22
        ('ALIGN', (0, 2), (-1, 2), 'CENTER'), # 第三行文字居中
        ('FONTSIZE', (0, 2), (-1, 2), 18), # 第三行文字字号18
        ('BACKGROUND', (0, 2), (-1, 2), HexColor('#E1EFD9')), # 第三行背景色为浅绿

 ('LEADING', (0, 4), (-1, 4), 22), # 设置第五行的行高为22
    ('ALIGN', (0, 4), (-1, 4), 'CENTER'), # 第五行文字居中
    ('FONTSIZE', (0, 4), (-1, 4), 18), # 第五行文字字号18
    ('BACKGROUND', (0, 4), (-1, 4), HexColor('#E1EFD9')), # 第五行背景色为浅绿

            ('LEADING', (0, 9), (-1, 9), 22), # 设置第八行的行高为22
    ('ALIGN', (0, 9), (-1, 9), 'CENTER'), # 第八行文字居中
    ('FONTSIZE', (0, 9), (-1, 9), 18), # 第八行文字字号18
    ('BACKGROUND', (0, 9), (-1, 9), HexColor('#E1EFD9')), # 第八行背景色为浅绿
    ('SPAN', (0, 9), (-1, 9)),  # 合并第八行所有列




        ('SPAN', (0, 3), (1, 3)),  # 合并第四行1,2列
        ('SPAN', (0, 4), (-1, 4)),  # 合并第五行所有列
        ('SPAN', (0, 5), (1, 5)),  # 合并第六行1,2列
        ('SPAN', (0, 6), (1, 6)),  # 合并第七行1,2列
        ('SPAN', (0, 7), (1, 7)),  # 合并第八行所有列
        ('SPAN', (0, 8), (1, 8)),  # 合并第九行1,2列
        
        # ('LEADING', (0, 5), (-1, 5), 15), # 说明部分 行高
        
        ('ALIGN', (0, 6), (-1, 6), 'CENTER'), # 图片显示居中
        # ('BACKGROUND', (1, 1), (-1, -1), colors.white), # 除了第1行其他的背景都为白色
        ('TEXTCOLOR', (0, 0), (-1, -1), colors.black), # 所有的字的颜色为黑色
        # ('LEADING', (0, 1), (-1, 3), 13), # 除了第1行至第4行 行高为12
        # ('ALIGN', (0, 1), (-1, 4), 'LEFT'), # 除了第1行 他行的行为左对齐
        # ('ALIGN', (0, 1), (-1, 4), 'LEFT'), # 除了第1行 他行的行为左对齐
        # ('ALIGN', (0, 6), (-1, -1), 'LEFT'), # 除了第1行 他行的行为左对齐
        ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), # 所有行高度居中
        # ('VALIGN', (0, 5), (-1, -1), 'TOP'), # 所有行高度居中
        ('ALIGN', (0, 0), (-1, -1), 'CENTER'), # 第三行文字居中
        # ('ALIGN', (3, 6), (5, 6), 'RIGHT'), # 除了第1行 他行的行为左对齐
        # ('ALIGN', (3, 7), (5, 7), 'RIGHT'), # 除了第1行 他行的行为左对齐
        ('FONTNAME', (0, 0), (-1, -1), 'MicrosoftYaHei'), # 所有字体为微软雅黑
        ('GRID', (0, 0), (-1, -1), 1, colors.black), # 绘制所有框线
        # ('LINEBELOW', (0, 7), (-1, 7), 1, colors.black), # 为图片行设置下边框
        # ('LINEBEFORE', (0, 6), (0, 7), 1, colors.black), # 给图片行设置左边框线
        # ('LINEAFTER', (-1, 6), (-1, 7), 1, colors.black), # 给图片行设置右边框线
        # ('LEFTPADDING', (0, 0), (-1, -1), 5), # 所有行左侧留白5
        # ('BOTTOMPADDING', (0, 0), (-1, -1), 5), # 所有行底部留白5
        # ('TOPPADDING', (0, 0), (-1, -1), 5), # 所有行顶侧留白5
        # ('FONTSIZE', (0, 1), (-1, -1), 10), # 除了第1行其他的字号为10
    ]))
    return main_table_element

# Convert JSON paths to Python paths
def convert_path(json_path):
    return json_path.replace("/", os.sep)


def create_sub_page(json_data):
    # Register font from JSON input
    register_fonts(json_data['font_path'])
    image_width_cm = 13
    img_list = [[]]  # 改为单层嵌套数组
    for index, img_path in enumerate(json_data['defects_dom_path']):
        if index >= 1:  # 只处理第一张图片
            break
        resized_image = resize_image(img_path, json_data['defects_dom_width_cm'])
        img_list[0].extend([
            "事件照片",
            resized_image,
            None, None  # 填充空列保持布局
        ])
        break  # 确保只插入一张
        img_index = 0
        if (index >= 2):
            img_index = 1
        img_list[img_index].append(f"事件照片")
        img_list[img_index].append(resized_image)  # Insert image at the correct position
        # img_list[img_index].append(None)
    # 获取sub page的数量
    sub_table_page = []
    # 修改为按子表顺序插入图片
    for idx, element in enumerate(json_data['sub_table_data']):
        sub_element = element.copy()
        # 为每个子表创建独立的图片列表
        img_group = []
        if idx < len(json_data['defects_dom_path']):
            img_path = json_data['defects_dom_path'][idx]
            resized_image = resize_image(img_path, json_data['defects_dom_width_cm'])
            img_group.extend([
                "事件照片",
                resized_image,
                None  # 空列占位
            ])
        
        sub_element.append(img_group)
        
        sub_table = Table(
            sub_element,
            colWidths=[3 * cm, 2 * cm, 4 * cm, 3 * cm, 2 * cm, 4 * cm],
            rowHeights=[None, 1 * cm, 1 * cm, 1 * cm, 1 * cm, 1 * cm, 2 * cm, 18 * cm])
        sub_table.setStyle(
            TableStyle([
                ('SPAN', (0, 0), (-1, 0)),  # 合并第一行所有列
                ('LEADING', (0, 0), (-1, 0), 22),  # 设置第一行的行高为22
                ('ALIGN', (0, 0), (-1, 0), 'CENTER'),  # 第一行文字居中
                ('FONTSIZE', (0, 0), (-1, 0), 18),  # 第一行文字字号18
                ('BACKGROUND', (0, 0), (-1, 0), HexColor('#E1EFD9')),  # 第一行为表头 背景色为浅绿

                ('SPAN', (1, 1), (2, 1)),  # 合并第2行2,3列
                ('SPAN', (4, 1), (5, 1)),  # 合并第2行5,6列
                ('SPAN', (1, 2), (2, 2)),  # 合并第3行2,3列
                ('SPAN', (4, 2), (5, 2)),  # 合并第3行5,6列
                ('ALIGN', (0, 3), (-1, 3), 'LEFT'),
                ('SPAN', (1, 4), (5, 4)),  # 合并第5行第一列外所有列
                ('SPAN', (1, 5), (-1, 5)),  # 合并第6行第一列外所有列
                ('SPAN', (1, 6), (-1, 6)),  # 合并第7行除第一列外所有列
                ('SPAN', (1, 7), (-1, 7)),  # 合并第8行所有列
                ('SPAN', (0, 8), (-1, 8)),  # 合并第9行所有列
                



                ('LEADING', (0, 3), (-1, 3), 15), # 说明部分 行高为


                ('ALIGN', (0, 4), (-1, 5), 'CENTER'),  # 图片显示居中
                ('BACKGROUND', (1, 1), (-1, -1), colors.white), # 除了第1行其他的背景都为白色
                ('TEXTCOLOR', (0, 0), (-1, -1), colors.black), # 所有的字的颜色为黑色
                ('ALIGN', (1, 4), (-1, 6), 'LEFT'), 
                # ('LEADING', (0, 1), (-1, 3), 13), # 除了第1行至第4行 行高为12
                # ('ALIGN', (0, 1), (-1, 3), 'LEFT'), # 除了第1行 他行的行为左对齐
                ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), # 所有行高度居中
                # ('VALIGN', (0, 3), (-1, 3), 'TOP'), # 所有行高度居中
                # ('VALIGN', (0, 4), (-1, 5), 'MIDDLE'), # 所有行高度居中
                ('FONTNAME', (0, 0), (-1, -1), 'MicrosoftYaHei'), # 所有字体为微软雅黑
                ('GRID', (0, 0), (-1, 10), 1, colors.black), # 绘制所有框线
                # ('LINEBELOW', (0, 5), (-1, 5), 1, colors.black), # 为图片行设置下边框
                # ('LINEBEFORE', (0, 4), (0, 5), 1, colors.black), # 给图片行设置左边框线
                # ('LINEAFTER', (-1, 4), (-1, 5), 1, colors.black), # 给图片行设置右边框线
                ('LEFTPADDING', (0, 0), (-1, -1), 5), # 所有行左侧留白5
                ('ALIGN', (1, 4), (-1, 6), 'LEFT'), 
                ('BOTTOMPADDING', (0, 0), (-1, -1), 5), # 所有行底部留白5
                ('TOPPADDING', (0, 0), (-1, -1), 5), # 所有行顶侧留白5
                ('FONTSIZE', (0, 1), (-1, -1), 10), # 除了第1行其他的字号为10
                ('ALIGN', (0, 0), (-1, 3), 'CENTER'),
                ('ALIGN', (0, 6), (0, 6), 'CENTER'),
                ('ALIGN', (0, 7), (-1, 7), 'CENTER'),
            ]))

        sub_table_page.append(sub_table)
        
    return sub_table_page

# Load data from JSON file and generate PDF
def generate_report_from_json(json_file):
    with open(json_file, 'r', encoding='utf-8') as f:
        json_data = json.load(f)
    # Register font from JSON input
    register_fonts(json_data['font_path'])
    # Create PDF file, top margin set to 1 cm
    pdf = SimpleDocTemplate(json_data['report_path'], pagesize=A4, topMargin=1 * cm, bottomMargin=1 * cm)
    # 分别生产主页和内页
    main_table_element = create_main_page(json_data)
    sub_table_elements = create_sub_page(json_data)
    # 拼接PDF内容
    pdf_elements = []
    pdf_elements.append(main_table_element)
    pdf_elements.append(PageBreak()) 
    # 将每个子表单元素逐个添加到 pdf_elements 中
    for sub_table in sub_table_elements:
        pdf_elements.append(sub_table)
        pdf_elements.append(PageBreak()) 
    # Build PDF
    pdf.build(pdf_elements)


# Example usage
generate_report_from_json('test/v3/report_data.json')
